home *** CD-ROM | disk | FTP | other *** search
- _ADDING AN EXTENSION LANGUAGE TO YOUR SOFTWARE_
- by Neville Franks
-
-
- Figurσ 2:
-
- (a) sp = bp - size of stack frame;
- bp = sp[ stack frame link ];
- es = sp[ expression stack ];
- ip = sp[ return address ];
- sp = sp - sp[ argument count ];
-
-
-
- (b) sp[ return address ] = ip;
- sp[ stack frame link ] = bp;
- sp[ expression stack ] = es;
- sp[ argument count ] = arg_count;
- sp = sp + size of stack frame;
- bp = es = sp;
- ip = function address;
-
-
-
-
-
- Figurσ 4:
-
-
- switch( ip->instruction )
- {
- case LODI : /* load immediate -> ++sp */
- *++sp = ip->immed_val;
- ++ip;
- break;
-
- case STOR : /* store sp -> local variable */
- *(bp + ip->addr) = *sp;
- ++ip;
- break;
-
- case OPR_ADD : /* add values on stack */
- --sp;
- *sp += *( sp + 1 );
- ++ip;
- break;
-
- case JPT : /* conditional jump - true */
- if ( *sp == 0 )
- {
- ++ip; /* next instr */
- break;
- } /* note: fall through */
-
- case JMP : /* unconditional jump */
- ip = ip->addr;
- break;
-
- case ....
- }
-
-
-
- Figurσ 6:
-
- (a)
- add_up_numbers()
- {
- void *parms[4];
- int result;
-
- parms[0] = &result; /* result passed by reference */
- /* numbers passed by value */
- parms[1] = 23; parms[2] = 69; parms[3] = -78;
- pgm_run( "add_num", 4, parms );
- printf( "Result = %d", result );
- }
-
-
- (b)
- main( result, num1, num2, num3 )
- int *result, num1, num2, num3;
- {
- *result = num1 + num2 + num3;
- }